﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace DDD {

    /// <summary>
    /// Uniform変数 
    /// </summary>
    /// <remarks>
    /// この構造体はエンジン側がシェーダーに渡すUniform変数(シェーダーのグローバル変数のようなもの)をラップしたものです。
    /// Uniform変数名の<dic>Name</dic>と、データの元になる<dic>Object</dic>ソースとその<dic>PropertyInfo</dic>プロパティからなります。
    /// プロパティは<see cref="IExportable{TValue}"/>インターフェースを実装した値型か、
    /// それと同等の機能を有する必要があります。
    /// また型がシェーダー側で宣言されたのと互換性がある必要があります。
    /// 指定されたプロパティは登録時に値を評価するのではなく、
    /// レンダリング時に値を評価しシェーダー側の同名のUniform変数に送られます。
    /// ユーザーが<dic>UnfiormVariable</dic>型を直接インスタンス化する事はできず、
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// <see cref="UniformArray"/>、<see cref="UniformVariable"/>と<see cref="ShaderDeclaration"/>も参考にしてください。
    /// </remarks>
    public struct UniformVariable {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="name">Uniform変数名</param>
        /// <param name="src">ソースオブジェクト</param>
        /// <param name="propertyName">プロパティ</param>
        public UniformVariable (string name, object src, string propertyName)
            : this () {
            this.Name = name;
            this.Source = src;
            this.PropertyName = propertyName;
        }

        /// <summary>
        /// Uniform変数名
        /// </summary>
        public string Name { get; private set; }

        /// <summary>
        /// ソースオブジェクト
        /// </summary>
        public object Source { get; private set; }

        /// <summary>
        /// プロパティ名
        /// </summary>
        public string PropertyName { get; private set; }

        /// <summary>
        /// 
        /// </summary>
        public override string ToString () {
            return string.Format("UniformVariable: Name={0}, Source={1}, Proerpty={2}", Name, Source, PropertyName);
        }
    }
}
